%%
%% This is file `codebox.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% codebox.dtx  (with options: `package')
%% 
%%     Copyright (C) 2020-2023 by Nan Geng <nangeng@nwafu.edu.cn>
%% --------------------------------------------------------------------------
%% 
%%     This work may be distributed and/or modified under the
%%     conditions of the LaTeX Project Public License, either
%%     version 1.3c of this license or (at your option) any later
%%     version. This version of this license is in
%%        http://www.latex-project.org/lppl/lppl-1-3c.txt
%%     and the latest version of this license is in
%%        http://www.latex-project.org/lppl.txt
%%     and version 1.3 or later is part of all distributions of
%%     LaTeX version 2005/12/01 or later.
%% 
%%     This work has the LPPL maintenance status "maintained".
%% 
%%     The Current Maintainer of this work is Nan Geng.
%% 
%% --------------------------------------------------------------------------
%% 
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{expl3}
\GetIdInfo$Id: codebox.dtx 1.1.0 2023-03-29 08:00:00 +0800 Nan Geng <nangeng@nwafu.edu.cn> $
  {Code Box with tcolorbox and minted/listings.}
\ProvidesExplPackage{\ExplFileName}
  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
\RequirePackage { xtemplate, l3keys2e, xparse }
\RequirePackage {fontawesome5, tcolorbox, varwidth, xcolor, etoolbox}
\ExplSyntaxOff
\patchcmd
{\tcb@input@library@in}
  {%
   \input\tcbpkgprefix#1\relax%
  }
  {%
    \@pushfilename
    \input\tcbpkgprefix#1\relax%
    \@popfilename
  }
  {}{}

\patchcmd
{\pgfutil@InputIfFileExists}
  {\input #1}
  {%
    \@pushfilename
    \xdef\@currname{#1}%
    \input #1 %
    \@popfilename
  }
  {}{}
\ExplSyntaxOn
\tcbuselibrary{skins, xparse, breakable}
\tcbuselibrary{minted,listings}
\usetikzlibrary{shapes.geometric}
\definecolor{cvgrayc}{RGB}{247,247,247}
\definecolor{cvgray}{RGB}{220,220,220}
\definecolor{cvgrayb}{RGB}{153,153,153}
\definecolor{cvblue}{RGB}{223,238,255}
\definecolor{chengse}{RGB}{250,140,53}
\tcbset{%
  skin=enhanced,
  lang/.style={%
    breakable,%
    drop~shadow,%
    colframe=gray!75!black,%
    left=4.5mm,
    enhanced,%
    colframe=tcbcolback!60!black,%
    colback=white,%
    colbacktitle=tcbcolback!5!gray!10!white,%
    fonttitle=\bfseries,%
    coltitle=black,%
    attach~boxed~title~to~top~center={%
      yshift=-0.25mm-\tcboxedtitleheight/2,%
      yshifttext=2mm-\tcboxedtitleheight/2%
    },%
    attach~boxed~title~to~top~left={%
      xshift=1cm,%
      yshift*=1mm-\tcboxedtitleheight%
    },%
    varwidth~boxed~title*=-3cm,%
    boxed~title~style={%
      frame~code={%
        \path[fill=tcbcolback!30!black]([yshift=-1mm,xshift=-1mm]frame.north~west)%
          arc[start~angle=0,end~angle=180,radius=1mm]([yshift=-1mm,xshift=1mm]frame.north~east)%
          arc[start~angle=180,end~angle=0,radius=1mm];%
        \path[left~color=tcbcolback!60!black,right~color=tcbcolback!60!black,
          middle~color=tcbcolback!80!black]([xshift=-2mm]frame.north~west)%
          --([xshift=2mm]frame.north~east)[rounded~corners=1mm]%
          --([xshift=1mm,yshift=-1mm]frame.north~east)%
          --(frame.south~east)%
          --(frame.south~west)%
          --([xshift=-1mm,yshift=-1mm]frame.north~west)[sharp~corners]%
          --cycle;%
      },%
      interior~engine=empty%
    },%
    overlay={%
      \begin{tcbclipinterior}
        \fill[tcbcolback!80!black] (frame.south~west) rectangle
         ([xshift=5mm]frame.north~west);
      \end{tcbclipinterior}%
    },
  }%
}%
\tcbset{%
  skin=enhanced,
  cv/.style={
    boxrule=0.4mm,
    breakable,
    top=0mm,
    boxsep=1mm,
    drop~shadow,
    attach~boxed~title~to~top,
    colframe=blue!75!black,
    left=4.5mm,
    right=0mm,
    enhanced,
    colframe=tcbcolback!60!black,
    colback=white,
    colbacktitle=cvgray,
    fonttitle=\ttfamily,
    coltitle=black,
    underlay~boxed~title = {
      \begin{tcbclipinterior}
        \fill[cvblue] (frame.south~west) rectangle ([xshift=5.0mm,yshift=0mm]frame.north~west);
      \end{tcbclipinterior}
    },
    underlay~middle = {
      \begin{tcbclipinterior}
        \fill[cvblue] (frame.south~west) rectangle
          ([xshift=5.0mm,yshift=0mm]frame.north~west);
      \end{tcbclipinterior}
    },
    underlay~last = {
      \begin{tcbclipinterior}
        \fill[cvblue] (frame.south~west) rectangle
          ([xshift=5.0mm,yshift=0mm]frame.north~west);
      \end{tcbclipinterior}
    },
  }
}%
\bool_new:N   \l__codebox_minted_bool
\bool_new:N   \l__codebox_comment_bool

\tl_new:N     \l__codebox_language_tl
\tl_new:N     \l__codebox_code_style_tl
\tl_new:N     \l__codebox_code_fontsize_tl
\tl_new:N     \l__codebox_code_name_tl
\tl_new:N     \l__codebox_comment_contents_tl
\tl_new:N     \l__codebox_comment_format_tl
\tl_new:N     \l__codebox_label_name_tl
\fp_new:N     \l__codebox_baseline_stretch_fp
\fp_new:N     \l__codebox_linenumber_sep_fp
\keys_define:nn { codebox }
  {
    minted .bool_set:N = \l__codebox_minted_bool,
    minted .default:n = true,
    minted .initial:n = true,
    lang .tl_set:N = \l__codebox_language_tl,
    lang .initial:n = c,
    pretitle .tl_set:N = \l__codebox_code_name_tl,
    pretitle .initial:n = Code,
    codestyle .tl_set:N = \l__codebox_code_style_tl,
    codestyle .initial:n = default,
    codesize .tl_set:N = \l__codebox_code_fontsize_tl,
    codesize .initial:n = \small,
    comments .tl_set:N = \l__codebox_comment_contents_tl,
    comments .initial:n = {},
    commentf .tl_set:N = \l__codebox_comment_format_tl,
    commentf .initial:n = \small\sffamily,
    codestretch .code:n = { \fp_set:Nn \l__codebox_baseline_stretch_fp { #1 }
                         },
    codestretch .initial:n = 1.0,
    linenumsep .fp_set:N  = \l__codebox_linenumber_sep_fp,
    linenumsep .initial:n = 1.80,
    label .tl_set:N = \l__codebox_label_name_tl,
    label .initial:n = {},
    unknown .code:n = { \__codebox_error:n { unknown-option } }
  }
\msg_new:nnn { codebox } { unknown-option }
  { package~ option~ "\l_keys_key_tl"~ is~ unknown. }
\NewDocumentCommand \codeset { m }
  { \keys_set:nn { codebox } {#1} }
\cs_new:Npn \__codebox_set_counter_parent:
  {
    \ifdef{\thechapter}
      {
        \newcounter{cvcounter}[chapter]%
        \renewcommand{\thecvcounter}{\thechapter.\arabic{cvcounter}}
      }{
        \newcounter{cvcounter}%[section]%
      }
  }
\cs_new:Npn \__codebox_minted_engine_tcbset:nnn #1#2#3
  {
    \tcbset{
      listing~engine=minted,%
      minted~style=#1,
      minted~options={%
        autogobble,
        breaklines,%
        fontsize=#2, %\tl_use:N \l__codebox_code_fontsize_tl,%
        baselinestretch=\fp_eval:n { \l__codebox_baseline_stretch_fp },
        breaksymbolleft={},%
        linenos,%
        numbersep=\fp_eval:n { \l__codebox_linenumber_sep_fp }~mm,
      },%
      minted~language=#3%\tl_use:N \l__codebox_language_tl%
    }
  }
\cs_generate_variant:Nn \__codebox_minted_engine_tcbset:nnn {VVV}
\cs_new:Npn \__codebox_listings_engine_tcbset:
  {
    \lstset{% general command to set parameter(s)
      basicstyle=\ttfamily\tl_use:N \l__codebox_code_fontsize_tl, % print whole listing small
      keywordstyle=\color{chengse}\bfseries,%
      identifierstyle=, % nothing happens
      breaklines=true,
      commentstyle=\itshape\color{gray},
      stringstyle=\ttfamily, % typewriter type for strings
      numbers=left,%
      numberstyle=\tl_use:N \l__codebox_code_fontsize_tl\sffamily\color[rgb]{0.5,0.5,1.0},%
    }%
    \tcbset{
      overlay={%
        \begin{tcbclipinterior}
          \fill[tcbcolback!80!black] (frame.south~west) rectangle
                                     ([xshift=5mm]frame.north~west);
        \end{tcbclipinterior}%
      },%
      listing~options={
        language=\tl_use:N \l__codebox_language_tl,
        numbersep=\fp_eval:n { \l__codebox_linenumber_sep_fp }~mm,
        %linebackgroundcolor={\ifodd\value{lstnumber}\color{cvgray}\fi}
      }
    }%
  }
\cs_new:Npn \__codebox_code_engine_tcbset:
  {
    \bool_if:NTF \l__codebox_minted_bool
      {
        \__codebox_minted_engine_tcbset:VVV \l__codebox_code_style_tl \l__codebox_code_fontsize_tl \l__codebox_language_tl
      }{
        \__codebox_listings_engine_tcbset:
      }
  }
\cs_new:Npn \__codebox_comment_tcbset:
  {
    \bool_if:NTF { \l__codebox_comment_bool }
    {
      \tcbset{%
        listing~and~comment,%
        colbacklower=tcbcolback!5!yellow!10!white,%
        collower=tcbcolback!60!black,%
        comment={\tl_use:N \l__codebox_comment_format_tl~
                 \tl_use:N \l__codebox_comment_contents_tl},%
      }
    }{
      \tcbset{ listing~only,}
    }
  }
\NewDocumentEnvironment{ codebox }{O{} m }
  {
    \group_begin:
    \bool_set_false:N  \l__codebox_comment_bool
    \keys_set:nn { codebox } { #1 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tcbset{lang, title={#2} }%
    \tcblisting{}
  }{
    \endtcblisting
    \group_end:
  }
\NewDocumentEnvironment{ codebox* }{O{} m }
  {
    \group_begin:
    \bool_set_false:N  \l__codebox_comment_bool
    \keys_set:nn { codebox } { #1 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tcbset{lang, title={#2} }%
    \tcblisting{}
  }{
    \endtcblisting
    \group_end:
  }
\NewDocumentCommand \codefile { s O{} m m }
  {
    \group_begin:
    \IfBooleanTF{#1}
      {
        \bool_set_true:N  \l__codebox_comment_bool
      }{
        \bool_set_false:N \l__codebox_comment_bool
      }
    \keys_set:nn { codebox } { #2 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tcbset{
      lang,
      title={#3},
      listing~file={#4},
    }%
    \tcbinputlisting{  }
    \group_end:
  }
\__codebox_set_counter_parent:
\DeclareTCBListing[use~counter=cvcounter]{codeviewaux}{m}
  {
    title={\tl_use:N \l__codebox_code_name_tl\nobreakspace\thecvcounter\nobreakspace~#1},
  }
\NewDocumentEnvironment{ codeview }{O{} m }
  {
    \group_begin:
    \bool_set_false:N  \l__codebox_comment_bool
    \keys_set:nn { codebox } { #1 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tl_if_empty:NF \l__codebox_label_name_tl
    {
      \tcbset{
        label=\tl_use:N \l__codebox_label_name_tl,
      }
    }
    \tcbset{
      cv,
      overlay~unbroken~and~first ={
        \begin{tcbclipinterior}
          \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb]
            at (frame.north~east){
              \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\
              \MakeUppercase{\tl_use:N \l__codebox_language_tl}
            };
        \end{tcbclipinterior}
      }
    }%
    \codeviewaux{#2}
  }{
    \endcodeviewaux
    \group_end:
  }
\NewDocumentEnvironment{ codeview* }{O{} m }
  {
    \group_begin:
    \bool_set_true:N  \l__codebox_comment_bool
    \keys_set:nn { codebox } { #1 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tl_if_empty:NF \l__codebox_label_name_tl
    {
      \tcbset{
        label=\tl_use:N \l__codebox_label_name_tl,
      }
    }
    \tcbset{
      cv,
      overlay~unbroken~and~first ={
        \begin{tcbclipinterior}
          \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb]
            at (frame.north~east){
              \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\
              \MakeUppercase{\tl_use:N \l__codebox_language_tl}
            };
        \end{tcbclipinterior}
      }
    }%
    \codeviewaux{#2}
  }{
    \endcodeviewaux
    \group_end:
  }
\DeclareTCBInputListing[use~counter=cvcounter]{\langfileaux}{m}
  {
    title={\tl_use:N \l__codebox_code_name_tl\nobreakspace\thecvcounter\nobreakspace~#1},
  }
\NewDocumentCommand \cvfile { s O{} m m }
  {
    \group_begin:
    \IfBooleanTF{#1}
      {
        \bool_set_true:N  \l__codebox_comment_bool
      }{
        \bool_set_false:N \l__codebox_comment_bool
      }
    \keys_set:nn { codebox } { #2 }
    \__codebox_code_engine_tcbset:
    \__codebox_comment_tcbset:
    \tl_if_empty:NF \l__codebox_label_name_tl
    {
      \tcbset{
        label=\tl_use:N \l__codebox_label_name_tl,
      }
    }
    \tcbset{
      cv,
      listing~file={#4},
      overlay~unbroken~and~first ={
        \begin{tcbclipinterior}
          \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb]
            at (frame.north~east){
              \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\
              \MakeUppercase{\tl_use:N \l__codebox_language_tl}
            };
        \end{tcbclipinterior}
      }
    }%
    \langfileaux{#3}
    \group_end:
  }
%% 
%%     This package consists of the file  codebox.dtx,
%%                  and the derived files codebox.sty,
%%                                        codebox.pdf,
%%                                        codebox.ins,
%%                                        README.md.
%%
%% End of file `codebox.sty'.
